package br.com.pi.SmartFast.controler;

import br.com.pi.SmartFast.model.Cidade;
import br.com.pi.SmartFast.model.Funcionario;
import br.com.pi.SmartFast.model.FuncionarioDAO;
import br.com.pi.SmartFast.model.Genero;
import br.com.pi.SmartFast.model.Profissao;
import br.com.pi.SmartFast.model.UnidadeFederal;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Jeferson de Andrade
 */
public class ControleTelaCadastroFuncionario {

    private javax.swing.JButton botaoSair;
    private javax.swing.JButton jBEditar;
    private javax.swing.JButton jBSalvar;
    private javax.swing.JComboBox jCCategoria;
    private javax.swing.JComboBox jCGenero;
    private javax.swing.JComboBox jComboCidade;
    private javax.swing.JComboBox jComboUF;
    private javax.swing.JPasswordField jPasswordSenha1;
    private javax.swing.JPasswordField jPasswordSenha2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextField jTEndereco;
    private javax.swing.JTextField jTLogin;
    private javax.swing.JTextField jTNome;
    private javax.swing.JTable jTableFuncionario;
    private javax.swing.JTextField jTfone;
    private ResultSet rs = null;
    private FuncionarioDAO dao = new FuncionarioDAO();
    private Funcionario funcGeral = null;
    private Funcionario func = new Funcionario();

    public ControleTelaCadastroFuncionario(JButton botaoSair, JButton jBEditar,
            JButton jBSalvar, JComboBox jCCategoria, JComboBox jCGenero,
            JComboBox jComboCidade, JComboBox jComboUF, JPasswordField jPasswordSenha1,
            JPasswordField jPasswordSenha2, JScrollPane jScrollPane1,
            JTextField jTEndereco, JTextField jTLogin, JTextField jTNome,
            JTable jTableFuncionario, JTextField jTfone) {
        this.botaoSair = botaoSair;
        this.jBEditar = jBEditar;
        this.jBSalvar = jBSalvar;
        this.jCCategoria = jCCategoria;
        this.jCGenero = jCGenero;
        this.jComboCidade = jComboCidade;
        this.jComboUF = jComboUF;
        this.jPasswordSenha1 = jPasswordSenha1;
        this.jPasswordSenha2 = jPasswordSenha2;
        this.jScrollPane1 = jScrollPane1;
        this.jTEndereco = jTEndereco;
        this.jTLogin = jTLogin;
        this.jTNome = jTNome;
        this.jTableFuncionario = jTableFuncionario;
        this.jTfone = jTfone;
    }

    public void carregaUF() {
        jComboUF.removeAllItems();
        try {
            String sql = "SELECT nome FROM uf";            
            this.rs = dao.getDadosTabela(sql);           
            if (rs.next()) {
                do {
                    jComboUF.addItem(rs.getString("nome"));                   
                } while (rs.next());
            }

        } catch (Exception e) {
        }
    }

    public void carregaCidades(String uf) {
        jComboCidade.removeAllItems();
        try {
            String sql = "SELECT cd.nome FROM cidade as cd, uf as uf"
                    + " WHERE uf.nome like '" + uf + "'"
                    + " AND cd.fk_idUF = uf.id_uf";
            this.rs = dao.getDadosTabela(sql);

            if (rs.next()) {
                do {
                    jComboCidade.addItem(rs.getString("cd.nome"));

                } while (rs.next());
            }

        } catch (Exception e) {
        }
    }

    public UnidadeFederal carregaIdUF() {
        UnidadeFederal uf = new UnidadeFederal();

        try {
            String sql = "SELECT id_uf FROM uf WHERE"
                    + " nome LIKE'" + jComboUF.getSelectedItem().toString() + "'";
            this.rs = dao.getDadosTabela(sql);
            rs.next();
            uf.setIdUF(rs.getInt("id_uf"));

            return uf;

        } catch (Exception e) {

            return null;
        }
    }

    public Cidade carregaIdCidade() {
        Cidade cd = new Cidade();

        try {
            String sql = "SELECT id_cidade FROM cidade WHERE"
                    + " nome LIKE'" + jComboCidade.getSelectedItem().toString() + "'";
            this.rs = dao.getDadosTabela(sql);
            rs.next();
            cd.setIdCidade(rs.getInt("id_cidade"));

            return cd;

        } catch (Exception e) {
            System.out.println(e);
            System.out.println(cd.getIdCidade());
            return null;
        }
    }

    public void carregaGenero() {
        jCGenero.removeAllItems();
        try {
            String sql = "SELECT descricao FROM genero";
            this.rs = dao.getDadosTabela(sql);

            if (rs.next()) {
                do {
                    jCGenero.addItem(rs.getString("descricao"));

                } while (rs.next());
            }

        } catch (Exception e) {
        }
    }

    public Genero carregaIdGenero() {
        Genero gn = new Genero();

        try {
            String sql = "SELECT id_genero FROM genero WHERE"
                    + " descricao LIKE'" + jCGenero.getSelectedItem().toString() + "'";
            this.rs = dao.getDadosTabela(sql);
            rs.next();
            gn.setIdGenero(rs.getInt("id_genero"));

            return gn;

        } catch (Exception e) {
            return null;
        }
    }

    public void carregaCategoria() {
        jCCategoria.removeAllItems();
        try {
            String sql = "SELECT nome FROM profissao";
            this.rs = dao.getDadosTabela(sql);

            if (rs.next()) {
                do {
                    jCCategoria.addItem(rs.getString("nome"));

                } while (rs.next());
            }

        } catch (Exception e) {
        }
    }

    public Profissao carregaIdProfissao() {
        Profissao pr = new Profissao();

        try {
            String sql = "SELECT id_profissao FROM profissao WHERE"
                    + " nome LIKE'" + jCCategoria.getSelectedItem().toString() + "'";
            this.rs = dao.getDadosTabela(sql);
            rs.next();
            pr.setIdProfissao(rs.getInt("id_profissao"));

            return pr;

        } catch (Exception e) {
            return null;
        }
    }

    public void verificaSenha() {

        boolean confereSenha = false;
        if (jPasswordSenha2.getText().length()
                == jPasswordSenha1.getText().length()) {
            confereSenha = true;
        }
        if (confereSenha == true) {
            if (jPasswordSenha1.getText().equals(jPasswordSenha2.getText())) {
                JOptionPane.showMessageDialog(null, "A senha Confere.");
            } else {
                JOptionPane.showMessageDialog(null, "A senha não confere. Digite Novamente");
                jPasswordSenha1.setText(null);
                jPasswordSenha2.setText(null);
                jPasswordSenha1.requestFocus();
            }
        }
    }

    private boolean getCamposObrigatorios() {

        if (this.jTNome.getText().equalsIgnoreCase("")) {
            JOptionPane.showMessageDialog(null, "Campo Nome é Obrigatório");
            return false;
        } else {
            if (this.jCGenero.getSelectedItem().equals("")) {
                JOptionPane.showMessageDialog(null, "Campo Genero é Obrigatório");
                return false;
            } else {
                if (this.jComboUF.getSelectedItem().equals("")) {
                    JOptionPane.showMessageDialog(null, "Campo UF é Obrigatório");
                    return false;
                } else {
                    if (this.jComboCidade.getSelectedItem().equals("")) {
                        JOptionPane.showMessageDialog(null, "Campo Cidade é Obrigatório");
                        return false;
                    } else {
                        if (this.jCCategoria.getSelectedItem().equals("")) {
                            JOptionPane.showMessageDialog(null, "Campo Cidade é Obrigatório");
                            return false;
                        } else {
                            if (this.jPasswordSenha1.getText().equals("")) {
                                JOptionPane.showMessageDialog(null, "Campo Cidade é Obrigatório");
                                return false;
                            } else {
                                if (this.jPasswordSenha2.getText().equals("")) {
                                    JOptionPane.showMessageDialog(null, "Campo Cidade é Obrigatório");
                                    return false;
                                } else {
                                    if (this.getNomeFuncionarioCadastro()) {
                                        JOptionPane.showMessageDialog(null, "Funcionario possui cadastro no banco!!", "Consulte Banco Dados", JOptionPane.INFORMATION_MESSAGE);
                                        return false;
                                    } else {
                                        return true;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    /** Retorna verdadeiro se o nome do Funcionario estiver registrado no banco de dados
     *
     * @return
     * @throws SQLException
     */
    private boolean getNomeFuncionarioCadastro() {

        try {
            rs = dao.getDadosTabela("SELECT nome FROM funcionario WHERE nome = '" + this.jTNome.getText() + "'");

            if (rs.next()) {
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            return false;
        }
    }

    /**Método utilizado para obter informações da tela e formar o objeto funcionario
     *
     * @return
     */
    private Funcionario setPovoarFuncionario() {

        Funcionario fun = new Funcionario();  //inicializa o objeto
//        Cidade cd = new Cidade();
////        UnidadeFederal uf = new UnidadeFederal();
//        Genero gn = new Genero();
//        Profissao pr = new Profissao();

//        cd.setNomeCidade(this.jComboCidade.getSelectedItem().toString());//resgata o nome da cidade da tela
//        uf.setNomeUF(this.jComboUF.getSelectedItem().toString());//resgata a UF da tela
//
//        cd.setUnidFederal(uf);
//
//        gn.setDescricaoGenero(this.jCGenero.getSelectedItem().toString());//resgata o genero da tela
//        pr.setNomeProfissao(this.jCCategoria.getSelectedItem().toString());//resgata a categoria ou profissão da tela

        fun.setNome(this.jTNome.getText());//resgata o nome da tela
        fun.setEndereco(this.jTEndereco.getText());//resgata o endereço da tela
        fun.setTelefone(this.jTfone.getText());//resgata o telefone da tela
        fun.setLogin(this.jTLogin.getText());//resgata o login da tela
        fun.setSenha(this.jPasswordSenha1.getText());//resgata a senha da tela
        fun.setFk_Cidade(this.carregaIdCidade().getIdCidade());
        fun.setFk_Genero(this.carregaIdGenero().getIdGenero());
        fun.setFk_Profissao(this.carregaIdProfissao().getIdProfissao());

//        func.setCidade(cd);
//        func.setGenero(gn);
//        func.setProfissao(pr);


        return fun;//retorna o objeto produto povoado
    }


     /**Método utilizado para obter informações da tela e formar o
      * objeto Funcionario após editado
     *
     * @return
     */
    private Funcionario setPovoarFuncionarioEditado() {
        Funcionario fun = new Funcionario();  //inicializa o objeto

            Object codfunc = this.jTableFuncionario.getValueAt(this.jTableFuncionario.getSelectedRow(), 0);
            int cod = (Integer) codfunc;

        fun.setIdFuncionario(cod);
        fun.setNome(this.jTNome.getText());//resgata o nome da tela
        fun.setEndereco(this.jTEndereco.getText());//resgata o endereço da tela
        fun.setTelefone(this.jTfone.getText());//resgata o telefone da tela
        fun.setLogin(this.jTLogin.getText());//resgata o login da tela
        fun.setSenha(this.jPasswordSenha1.getText());//resgata a senha da tela
        fun.setFk_Cidade(this.carregaIdCidade().getIdCidade());
        fun.setFk_Genero(this.carregaIdGenero().getIdGenero());
        fun.setFk_Profissao(this.carregaIdProfissao().getIdProfissao());

        return fun;//retorna o objeto produto povoado
    }



    /**Método para limpar tela
     *
     */
    private void setLimpaTexto() {
        this.jTEndereco.setText("");
        this.jTLogin.setText("");
        this.jTNome.setText("");
        this.jTfone.setText("");
        this.jPasswordSenha1.setText("");
        this.jPasswordSenha2.setText("");
        this.jCCategoria.setSelectedItem("");
        this.jCGenero.setSelectedItem("");
        this.jComboCidade.setSelectedItem("");
        this.jComboUF.setSelectedItem("");
    }

    /** Método destinado a inserir itens na tabela de cadastro de Funcionários
     *
     */
    public void setPreencheTabela() {

        int r = 0;       //variavel para incrementar linhas da tabela

        for (int i = 0; i < this.jTableFuncionario.getRowCount(); i++) {//usado para remover dados da tabela
            for (int j = 0; j < this.jTableFuncionario.getColumnCount(); j++) {//para inserir novos dados
                this.jTableFuncionario.setValueAt("", i, j);
            }
        }

        //instrução sql que fará a pesquisa no banco
        String sql = "SELECT p.nome, f.nome, f.id_funcionario FROM profissao as p, funcionario as f"
                + " WHERE f.fk_profissao = p.id_profissao";


        try {//rs recebe pesquisa do banco para inserir na tabela
            rs = dao.getDadosTabela(sql);
            if (rs.next()) {//se existirem registros
                do {
                    this.jTableFuncionario.setValueAt(rs.getInt("f.id_funcionario"), r, 0);//tipo de produto
                    this.jTableFuncionario.setValueAt(rs.getString("f.nome"), r, 1);//tipo de produto
                    this.jTableFuncionario.setValueAt(rs.getString("p.nome"), r, 2);//código produto
                    r++;
                } while (rs.next());
            }
        } catch (SQLException ex) {
        }
    }

    /** Método destinado a consultar o Funcionario selecionado no banco de dados
     *
     * @param clique
     */
    public void duploCliqueTabelaFuncionario(int clique) {

        if (clique == 2) {//se derem um duplo clique
            //variavel recebe o código do Funcionario selecionado
            Object codfunc = this.jTableFuncionario.getValueAt(this.jTableFuncionario.getSelectedRow(), 0);
            int cod = (Integer) codfunc;
            func.setIdFuncionario(cod);
            //consulta no banco
            String sql = "SELECT fc . * , gn.descricao, uf.nome, cd.nome, pr.nome"
                    + " FROM funcionario AS fc, genero AS gn, uf, cidade AS cd, profissao AS pr"
                    + " WHERE id_funcionario = '" + cod + "'"
                    + " AND fc.fk_genero = gn.id_genero"
                    + " AND fc.fk_cidade = cd.id_cidade"
                    + " AND fc.fk_profissao = pr.id_profissao"
                    + " AND cd.fk_iduf = uf.id_uf";

            //consulta no banco
            try {
                this.rs = dao.getDadosTabela(sql);

                //se existirem registros
                if (this.rs.next()) {
                    String cidade = rs.getString("cd.nome");
                    String nome = rs.getString("fc.nome");
                    String endereco = rs.getString("fc.endereço");
                    String fone = rs.getString("fc.telefone");
                    String login = rs.getString("fc.login");
                    String senha = rs.getString("fc.senha");

                    this.jCGenero.setSelectedItem(rs.getString("gn.descricao"));
                    this.jCCategoria.setSelectedItem(rs.getString("pr.nome"));
                    this.jComboUF.setSelectedItem(rs.getString("uf.nome"));
                    carregaCidades(rs.getString("uf.nome"));
                    //this.jComboCidade.setSelectedItem(rs.getString("cd.nome"));

                    this.jComboCidade.setSelectedItem(cidade);

                    this.jTNome.setText(nome);
                    this.jTEndereco.setText(endereco);
                    this.jTfone.setText(fone);
                    this.jTLogin.setText(login);
                    this.jPasswordSenha1.setText(senha);
                    this.jPasswordSenha2.setText(senha);

//                    this.jTNome.setText(rs.getString("fc.nome"));
//                    this.jTEndereco.setText(rs.getString("fc.endereço"));
//                    this.jTfone.setText(rs.getString("fc.telefone"));
//                    this.jTLogin.setText(rs.getString("fc.login"));
//                    this.jPasswordSenha1.setText(rs.getString("fc.senha"));
//                    this.jPasswordSenha2.setText(rs.getString("fc.senha"));


                    this.jBEditar.setEnabled(true);
                    this.jBSalvar.setEnabled(false);

                    this.funcGeral = this.setPovoarFuncionario();

                }
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Acesso ao banco negado!!!" + e);
            }

        }
    }

    /*Método para acrescentar linha na tabela
     *
     */
    public void acrescentaLinhaTabela() {
        DefaultTableModel dtm = (DefaultTableModel) jTableFuncionario.getModel();
        int linhas = dtm.getRowCount();
        dtm.setRowCount(linhas + 1);
    }

    public void botaoSalvar() {

        try {
            //verifica se os campos obrigatórios estão preenchidos - true grava no banco//false - exibe mensagem e não grava
            if (this.getCamposObrigatorios()) {
                this.dao.gravaFuncionario(this.setPovoarFuncionario());//objeto dao para gravar no banco e método que retorna um objeto Produto
                this.funcGeral = this.setPovoarFuncionario();
                this.setLimpaTexto();//limpa os campos para novo cadastro
                this.acrescentaLinhaTabela();
                this.setPreencheTabela();//consulta o banco e preenche a tabela com registros existentes

            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e + "ERRO AO SALVAR!!!:", "Erro de gravação", JOptionPane.ERROR_MESSAGE);
        }
    }//Fim botaoSalvar

    /** Método para editar produtos no banco de dados
     *
     */
    public void botaoEditar() {
        try {
            //verifica se os campos obrigatórios estão preenchidos - true grava no banco//false - exibe mensagem e não grava
            //if (this.getCamposObrigatorios()) {
                this.funcGeral = this.setPovoarFuncionarioEditado();
                this.dao.EditarFuncionario(funcGeral);
                this.setPreencheTabela();
                this.jBEditar.setEnabled(false);
                this.jBSalvar.setEnabled(true);
                this.setLimpaTexto();
            //}
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e + "ERRO AO SALVAR!!!:", "Erro de gravação", JOptionPane.ERROR_MESSAGE);
        }
    }//FimbotaoEditar
}//FIM CLASSE

